[NOIP2012]-疫情控制

挺妙(烦)的!

大致思路很好构建:二分答案,贪心上跳。跳不到根的就让它停在那,能跳到的就要考虑互相救助了。

但是怎么知道,如果我选择救助别的子树,情况会不会变劣?

有个很重要的结论:如果我到根后剩余的步数小于我从根走回到所在子树的距离,那我就不跳到根,留在差一步的子树顶。这个还挺容易 yy,因为会使后面更大的剩余步数浪费掉。否则那我就跳呗。

可是为什么我跳,答案不会变劣?

其实是要分类讨论的。将需要救助的子树顶到根的距离排序,将剩余步数排序。剩余步数排名和需要救助的步数排名一一对应,显然不劣;错开,发现就影响中间一段;而前者比后者好的时候显然不劣;前者比后者差的情况根本就不存在,因为大小关系不对劲。

所以就跳!

证明还挺容易,但是怎么想到啊 /kk

$Code$